
//interface
interface IPoint {
    x: number;
    y: number;
    
}

interface IPerson {
    id: number;
    readonly name: string; // 在字段前面加上readonly，表示为只读，一旦赋值后就再也不能被改变了
    nick_name?: string;     // 在字段后面加上 ? 号，表示为可选
    sex: string;
}

//画点方法
let drawPoint = (point: IPoint) => {
    console.log({x: point.x, y: point.y});
}

//计算两点之间的距离方法
let getDistances = (a: IPoint, b: IPoint):number => {
    return Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2);
    // ...
}

let p: IPoint = { x: 105, y: 24};
drawPoint(p);
//drawPoint({ x: "simon", y: "young"}); //报错，键类型为number，不符合接口规范
//drawPoint({ weather: "晴", temperature: "27°C"}); //报错，键名不存在，不符合接口规范
let a: IPoint = { x: 10, y: 20};
let b: IPoint = { x: 110, y: 120};
console.log(getDistances(a, b));

//查询学生基本信息
let getStudentInfo = (student: IPerson) => {
    // student.name = '海阳之新'; // 报错，因为name为只读字段
    console.log({id: student.id, name: student.name, sex: student.sex, nick_name: student.nick_name});
}
let student = {
    id: 1,
    name: 'simon',
    sex: '男'
};
console.log(getStudentInfo(student));

// readonly vs const
// 最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const，若做为属性则使用 readonly。

//以上方法与接口都是有紧密关系的，这样定义方法表面看起来没有问题，但如果是团队协作，
//各自定义的方法在不同的文件当中，很散，不利于维护，所以接下来学习class